package com.mycat.redis.util;

import com.mycat.redis.pool.JedisConnection;
import com.mycat.redis.pool.single.RedisSinglePool;
import redis.clients.jedis.Jedis;

import java.util.Set;

/**
 * Redis相关方法
 *
 * @author roger.
 * @email 190642964@qq.com
 * @create 2016-12-26
 */
public class RedisUtil {

    private static JedisConnection getInstance() {
        return RedisSinglePool.getInstance();
    }

    /**
     * 验证客户端和服务端是否正常连接
     *
     * @return 正常-PONG，否则返回一个连接错误
     */
    public static String ping() {
        Jedis jedis = getInstance().getResource();
        String data = jedis.ping();
        jedis.close();
        return data;
    }

    /**
     * 键的重命名，不存在旧的key时出现异常
     *
     * @param oldKey 旧的键
     * @param newKey 新的键
     * @return 成功-OK
     */
    public static String rename(String oldKey, String newKey) {
        Jedis jedis = getInstance().getResource();
        String data = jedis.rename(oldKey, newKey);
        jedis.close();
        return data;
    }

    /**
     * 清空当前数据库下所有数据
     *
     * @return 成功-OK
     */
    public static String flushDB() {
        Jedis jedis = getInstance().getResource();
        String data = jedis.flushDB();
        jedis.close();
        return data;
    }

    /**
     * 清空所有数据库的所有数据
     *
     * @return 成功-OK
     */
    public static String flushAll() {
        Jedis jedis = getInstance().getResource();
        String data = jedis.flushAll();
        jedis.close();
        return data;
    }

    /**
     * 选择当前服务器的数据库
     *
     * @param index 【0-15】
     * @return 成功返回OK
     */
    public static String select(int index) {
        Jedis jedis = getInstance().getResource();
        String data = jedis.select(index);
        jedis.close();
        return data;
    }

    /**
     * 查看当前Redis的信息
     *
     * @return 返回数据库相关信息
     */
    public static String info() {
        Jedis jedis = getInstance().getResource();
        String data = jedis.info();
        jedis.close();
        return data;
    }


    /**
     * 查看当前Redis某个模块的信息的信息
     *
     * @param section 模块名称[Server、Clients、Memory、Persistence、Stats、Replication、CPU、Cluster、Keyspace]
     * @return 相关信息
     */
    public static String info(String section) {
        Jedis jedis = getInstance().getResource();
        String data = jedis.info(section);
        jedis.close();
        return data;
    }

    /**
     * 获取当前key的剩余生存时间（秒）
     *
     * @param key 键
     * @return 键不存在=[-2]，没有设置生存时间=[-1]，以秒为单位返回当前key的剩余生存时间（秒）
     */
    public static long ttl(String key) {
        Jedis jedis = getInstance().getResource();
        long data = jedis.ttl(key);
        jedis.close();
        return data;
    }

    /**
     * 获取当前key的剩余生存时间（秒）
     *
     * @param key 键
     * @return 键不存在=[-2]，没有设置生存时间=[-1]，以秒为单位返回当前key的剩余生存时间（秒）
     */
    public static long ttl(byte[] key) {
        Jedis jedis = getInstance().getResource();
        long data = jedis.ttl(key);
        jedis.close();
        return data;
    }

    /**
     * 获取当前key的剩余生存时间（毫秒）
     *
     * @param key 键
     * @return 键不存在=[-2]，没有设置生存时间=[-1]，以秒为单位返回当前key的剩余生存时间（毫秒）
     */
    public static long pttl(String key) {
        Jedis jedis = getInstance().getResource();
        long data = jedis.pttl(key);
        jedis.close();
        return data;
    }

    /**
     * 获取当前key的剩余生存时间（毫秒）
     *
     * @param key 键
     * @return 键不存在=[-2]，没有设置生存时间=[-1]，以秒为单位返回当前key的剩余生存时间（毫秒）
     */
    public static long pttl(byte[] key) {
        Jedis jedis = getInstance().getResource();
        long data = jedis.pttl(key);
        jedis.close();
        return data;
    }

    /**
     * 获取当前key的值的类型
     *
     * @param key 键
     * @return none=[key不存在]、string=[字符串]、list=[列表]、set=[集合]、zset=[有序集合]、hash=[哈希表]
     */
    public static String type(String key) {
        Jedis jedis = getInstance().getResource();
        String data = jedis.type(key);
        jedis.close();
        return data;
    }

    /**
     * 获取当前key的值的类型
     *
     * @param key 键
     * @return none=[key不存在]、string=[字符串]、list=[列表]、set=[集合]、zset=[有序集合]、hash=[哈希表]
     */
    public static String type(byte[] key) {
        Jedis jedis = getInstance().getResource();
        String data = jedis.type(key);
        jedis.close();
        return data;
    }

    /**
     * 查找所符合给定模式pattern的key。
     * keys * 匹配数据库中所有的key；
     * keys h?llo 匹配hello，hallo和hxllo等。
     * keys h*llo 匹配hello，和heeeeeeelo等。
     * keys h[ea]llo 匹配hello和hallo，但不匹配hillo。
     *
     * @param pattern 匹配条件
     * @return 符合给定模式pattern的key集合
     */
    public static Set<String> keys(String pattern) {
        Jedis jedis = getInstance().getResource();
        Set<String> data = jedis.keys(pattern);
        jedis.close();
        return data;
    }

    /**
     * 查找所符合给定模式pattern的key。
     * keys * 匹配数据库中所有的key；
     * keys h?llo 匹配hello，hallo和hxllo等。
     * keys h*llo 匹配hello，和heeeeeeelo等。
     * keys h[ea]llo 匹配hello和hallo，但不匹配hillo。
     *
     * @param pattern 匹配条件
     * @return 符合给定模式pattern的key集合
     */
    public static Set<byte[]> keys(byte[] pattern) {
        Jedis jedis = getInstance().getResource();
        Set<byte[]> data = jedis.keys(pattern);
        jedis.close();
        return data;
    }

    /**
     * 检查key是否存在
     *
     * @param key 键
     * @return 存在-true，不存在-false
     */
    public static boolean exists(String key) {
        Jedis jedis = getInstance().getResource();
        boolean data = jedis.exists(key);
        jedis.close();
        return data;
    }

    /**
     * 检查key是否存在
     *
     * @param key 键
     * @return 存在-true，不存在-false
     */
    public static boolean exists(byte[] key) {
        Jedis jedis = getInstance().getResource();
        boolean data = jedis.exists(key);
        jedis.close();
        return data;
    }


    /**
     * 验证连接池是否未单例模式
     */
    public static void test() {
        System.out.println("test is single ....?");
    }
}
